#include <iostream>
#include <string.h>
#include "Mepa.h"

/**
 * Este arquivo contem a main(),
 * que recebera e tratara os parametros 
 * do usuario. Assim como a criacao
 * do objeto mepa
 */

int main(int argc, char **argv)
{
	if (argc <2)
	{
		std::cout << "\tParametros incorretos, use \"-?\" para ajuda." << std::endl;
		exit(0);
	}
	
	/* o objeto do interpretador Mepa */
	Mepa *mepa;
	
	/* Tamanhos padrao para P, M e D*/
	int
	sizeP = 200;	
	int
	sizeM = 400;	
	int
	sizeD = 50;
	
	/**
	 *  Arquivos
	 * Identificar as strings dos nomes dos arquivos pelos seus indices
	 */
	int
	indiceInput = 0;
	
	int
	indiceOutput = 0;
	
	
	/* Tratamento dos argumentos do programa */
	for ( int i =1 ; i< argc; i++)
	{
		/* verifica a presenca de '-', indicando um parametro */
		if (argv[i][0] == '-')
		{
			/* verifica  letra que segue o '-' */
			switch(argv[i][1])
			{
				case 'J':
					std::cout << "Opcao \"-J\" nao esta implementada" << std::endl;
					return 0;
					break;
					
				case 'D':
					/* ignora o espaco */
					i++;
					if (      (!(i < argc - 1))      ||     (!atoi(argv[i]))      ) 
					{
						std::cout << "Parametros incorretos" << std::endl;
						return 0;
					}
					sizeD = atoi(argv[i]);
					break;
					
				case 'P':
				/* ignora o espaco */

					i++;
					if (      (!(i < argc -1))     ||     (!atoi(argv[i]))    )
					{
						std::cout << "Parametros incorretos" << std::endl;
						return 0;
					}				
					sizeP = atoi(argv[i]);
					break;
					
				case 'M':
				/* ignora o espaco */

					i++;
					if (     (!(i < argc -1))     ||     (!atoi(argv[i]))     )
					{
						std::cout << "Parametros incorretos" << std::endl;
						return 0;
					}
					sizeM = atoi(argv[i]);
					break;
					
				case 'I':
					std::cout
					<< "\tDouglas Andre Schmidt\n"
					<< "\tFernando Biesdorf\n";
					return 0;
					
				case '?':
					std::cout 
					<< "Sintaxe: mepa [-J] [-D n] [-P n] [-M n] [-I] [-?] [-R arq] arquivo.mep\n\n"				
					<< "Detalhes:\n"
					<< "-J" << "\tImplementacao grafica opcional\n"
					<< "-D n" << "\tNumero de registradores base\n"
					<< "-P n" << "\tTamanho da memoria de programa\n"
					<< "-M n" << "\tTamanho da memoria de dados\n"
					<< "-I" << "\tIdentificacao da equipe\n"
					<< "-?" << "\tEsta tela\n"
					<< "-R arq" << "\tSalvar no arquivo arq o resultado da instrucao MOSM.\n"
					<< "\tCaso nao seja encontrado, o resultado sera mostrado na tela\n"
					<< "arquivo.mep" << "\tsera o arquivo que contera o executavel\n";
					
					return 0;
					
				case 'R':
				/* ignora o espaco entre o parametro e o nome do arquivo */
					i++;
					if ( !(i < argc -1) )
					{
						std::cout << "Parametros incorretos" << std::endl;
						return 0;
					}					
					/* poscao do nome do arquivo de saida MOSM em argv */
					indiceOutput = i;
					break;
					
				default:
					std::cout << "Parametros incorretos" << std::endl
					<< "\tTente usar -?\n";									
					return 0;
			
			}/* Fim do switch */
			
		}/* Fim do if '-' */
		else
		{
			/* se nao tiver '-' na frente eh o nome do pontoMep */
			indiceInput = i;
		}
		
	}//fim do for que le os parametros da mepa
	
	if(! indiceOutput)
	{
		mepa = new Mepa( argv[indiceInput], sizeP, sizeM, sizeD);
	}
	else
	{
		mepa = new Mepa( argv[indiceInput], argv[indiceOutput], sizeP, sizeM, sizeD );
	}
	
	mepa->carregaPrograma();
	mepa->rodar();

	return 0;
}//fim da main
